﻿using System;
using StockSharp.BusinessEntities;

namespace StockSharp.AlfaDirect
{
	/// <summary>
	/// Условие для формирования стоп-заявок, специфичных для <see cref="AlfaTrader"/>.
	/// </summary>
	public class AlfaStopCondition : StopCondition
	{
		private const string _keySlippage = "Slippage";
		private const string _keyTakeProfit = "TakeProfit";
	    private const string _keyStopPrice = "StopPrice";
	    private const string _keyTrailingLevel = "TrLevel";
        
		/// <summary>
		/// Slippage parameter. По умолчанию 0.
		/// </summary>
		public double Slippage
		{
			get { return Parameters.ContainsKey(_keySlippage) ? (double) Parameters[_keySlippage] : 0; }
		    set { Parameters[_keySlippage] = value; }
		}
		/// <summary>
		/// TakeProfit параметер. Если значение null значит параметр отключен. По умолчанию null
		/// </summary>
		public double? TakeProfit
		{
            get { return Parameters.ContainsKey(_keyTakeProfit) ? (double?)Parameters[_keyTakeProfit] : null; }
			set
			{
                // нельзя задать сразу TakeProfit и TrailingLevel
                if (TrailingLevel != null)
                {
                    throw new Exception("Нельзя в заявке одновременно задавать TakeProfit и TrailingLevel");
                }
                Parameters[_keyTakeProfit] = value;
			}
		}
        /// <summary>
        /// Стоп цена заявки.
        /// </summary>
	    public double StopPrice
	    {
            get { return Parameters.ContainsKey(_keyStopPrice) ? (double)Parameters[_keyStopPrice] : 0; }
            set { Parameters[_keyStopPrice] = value; }
	    }
        /// <summary>
        /// TrailingLevel параметер. Абсолютная величина, на которую цена может отклоняться от
        /// локального экстремума, после которой сработает стоп.
        /// Если значение null значит параметр отключен.
        /// </summary>
        public double? TrailingLevel
        {
            get { return Parameters.ContainsKey(_keyTrailingLevel) ? (double?)Parameters[_keyTrailingLevel] : null; }
            set
            {
                // нельзя задать сразу TakeProfit и TrailingLevel
                if (TakeProfit != null)
                {
                    throw new Exception("Нельзя в заявке одновременно задавать TakeProfit и TrailingLevel");
                }
                Parameters[_keyTrailingLevel] = value;
            }
        }


        /// <summary>
        /// Создает новый объект. 
        /// </summary>
        public AlfaStopCondition()
        {

        }

		/// <summary>
		/// Создать копию условия (копирование параметров условия).
		/// </summary>
		/// <returns>Копия условия.</returns>
		public override StopCondition Clone()
		{
			return new AlfaStopCondition
			{
				Slippage = Slippage,
				TakeProfit = TakeProfit,
                StopPrice = StopPrice,
                TrailingLevel = TrailingLevel,
			};
		}
	}
}
